package com.wfh.rpc.server.tcp;

import cn.hutool.socket.protocol.Protocol;
import com.wfh.rpc.protocal.ProtocolConstant;
import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;
import lombok.RequiredArgsConstructor;

/**
 * @Title: TcpBufferHandlerWrapper
 * @Author wangfenghuan
 * @Package com.wfh.rpc.server.tcp
 * @Date 2025/10/15 21:11
 * @description: 半包粘包处理器（装饰器模式）
 */
public class TcpBufferHandlerWrapper implements Handler<Buffer> {

    private final RecordParser recordParser;

    public TcpBufferHandlerWrapper(Handler<Buffer> bufferHandler){
        recordParser = initRecordParser(bufferHandler);
    }

    private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {

        // 构造parser
        RecordParser parser = RecordParser.newFixed(ProtocolConstant.MESSAGE_HEADER_LENGTH);
        parser.setOutput(new Handler<Buffer>() {
            // 初始化
            int size = -1;
            // 第一次完整读取（头 + 体）
            Buffer resBuffer = Buffer.buffer();
            @Override
            public void handle(Buffer buffer) {
               if (-1 == size){
                   // 读取消息体的长度
                   int size = buffer.getInt(13);
                   // 写入头信息到结果
                   parser.fixedSizeMode(size);
                   resBuffer.appendBuffer(buffer);
               }else {
                   // 写入体信息到结果
                   resBuffer.appendBuffer(buffer);
                   // 已拼接为完整的buffer，执行处理
                   bufferHandler.handle(resBuffer);
                   // 重置一轮
                   parser.fixedSizeMode(ProtocolConstant.MESSAGE_HEADER_LENGTH);
                   size = -1;
                   resBuffer = Buffer.buffer();
               }
            }
        });

        return parser;
    }

    @Override
    public void handle(Buffer buffer) {
        recordParser.handle(buffer);
    }
}
